/**
 * @文件名 ExtNutFilter.java
 * @包名 com.ykfk.cngrain.tbw.ExtNutFilter
 * @说明 在nutz内置的filer基础上进行扩展
 * @作者 wdfang
 * @时间 2013-1-28 下午6:22:11
 * @版本 V1.0
 */ 
package com.fang.yttz;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.nutz.mvc.NutFilter;
import org.nutz.mvc.view.ServerRedirectView;

/**
 * @类名 ExtNutFilter
 * @描述 扩展org.nutz.mvc.NutFilter 过滤器
 * @作者 wdfang
 * @日期 2013-1-28 下午6:22:11
 * ========修改日志=======
 *
 */
public class ExtNutFilter extends NutFilter{
	/**
	 * 编码设定
	 */
	protected String encoding = SysParameter.encoding;

	@Override
    public void init(FilterConfig conf) throws ServletException {
    	super.init(conf);
    }
	@Override
	public void destroy() {
		super.destroy();
	}
	@Override
	protected void finalize() throws Throwable {
		super.finalize();
	}
	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
		if (req instanceof HttpServletRequest) {
			doFilter((HttpServletRequest) req, (HttpServletResponse) resp, chain);
		} else {
			chain.doFilter(req, resp);
		}
	}
	/**
	 * 
	 * @throws IOException, ServletException 
	 * @名称 doFilter
	 * @描述 过滤器实现方法
	 * @参数 @param request
	 * @参数 @param response
	 * @参数 @param chain
	 * @返回值 void
	 * @作者 wdfang
	 * @时间 2013-1-28 下午7:36:08
	 */
	private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
		/**
		 * 全局session过滤
		 */
//		if(processSessionValid(request, response)){
//			return;
//		}
		/**
		 * session 处理完毕后再运行入口函数等过滤器
		 */
		super.doFilter(request, response, chain);
		/**
		 * 全局编码过滤
		 */
		processEncoding(request);
	}
	/**
	 * 
	 * @throws UnsupportedEncodingException 
	 * @名称 processEncoding
	 * @描述 全局编码设置
	 * @参数 @param request
	 * @参数 @throws Exception
	 * @返回值 void
	 * @作者 wdfang
	 * @时间 2013-1-28 下午7:24:52
	 */
	private void processEncoding(HttpServletRequest request) throws UnsupportedEncodingException{
		if (encoding != null) {
			Map<?,?> parameterMap = request.getParameterMap();
			if (!parameterMap.isEmpty()) {
				Iterator<?> it = parameterMap.keySet().iterator();
				String value[] = null;
				while (it.hasNext()) {
					value = (String[]) parameterMap.get(it.next());
					for (int i = 0; i < value.length; i++) {
						value[i] = new String(value[i].getBytes("ISO-8859-1"),encoding);
					}
				}
			}
		}
	}
	/**
	 * 
	 * @名称 processSessionValid
	 * @描述 全局session过滤
	 * @参数 @param request
	 * @参数 @param response
	 * @参数 @return
	 * @参数 @throws IOException
	 * @返回值 boolean
	 * @作者 wdfang
	 * @时间 2013-1-28 下午7:41:57
	 */
	private boolean processSessionValid(HttpServletRequest request, HttpServletResponse response) throws IOException {
		String uri = request.getRequestURI();
		/**
		 * web.xml 中 welcome-file 配置的重定向 补充显示页面 
		 */
		if(uri.endsWith(request.getContextPath()+"/")){
			try {
				new ServerRedirectView("login.jsp").render(request, response, null);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		if ((uri.indexOf(".do") != -1 || uri.indexOf(".jsp") != -1)
				&& uri.indexOf("uploadfile_result.jsp") == -1
				&& uri.indexOf("/login") == -1 && uri.indexOf("/logout") == -1
				&& uri.indexOf("left") == -1) { // logout是为了防止session失效后退出
			if (uri.contains("demo/addprocess.jsp")) {
				return false;
			}
			if (request.getSession().getAttribute(SysParameter.sessionObj) == null) {
				String script = "<script>window.parent.jAlert('<font color=\"#D7A728\">会话过期，为确保安全，请您重新登录。</font>','会话过期',function(){window.top.location.href='" + request.getContextPath()
						+ "';});</script>";
				response.getOutputStream().write(script.getBytes(encoding));
				/**
				 * 编码全局过滤，session过期后不再执行。
				 * 故此处设置编码类型
				 */
				response.setContentType("text/html; charset="+encoding);
				return true;
			}
		}
		return false;
	}
	public static void main(String[] args) {
	String uri = "ykfk/relogin.do";
	System.out.println(uri.indexOf(".do") != -1);
		System.out.println((uri.indexOf(".do") != -1 || uri.indexOf(".jsp") != -1)
		&& uri.indexOf("uploadfile_result.jsp") == -1
		&& uri.indexOf("login") == -1 && uri.indexOf("logout") == -1
		&& uri.indexOf("left") == -1);
	}
}
